function add<T>(a: T, b: T): T { //相当于 a,b 返回数据类型一定一致.

    return a;
}
add(10, 20); //T = number
add('aaa', 'bbbb') // T=string
add(true, false) //T = boolean
// add('aaa',20);//  T???  T=string  Error



function add2<T, U>(a: T, b: U): T { //相当于 a,b 返回数据类型一定一致.
    return a;
}
//自动推论.
add2(10, "hello");// T=number, U=string
add2(10, 90);// T=number, U=number
add2("10", "90");// T=number, U=number
//手动指定
add2<number, string>(10, "尼雅"); //T=number U=string
// add2<number,string>(10:number,"尼雅":string); // Error 因为现在在调用函数
let xyz: number = 90;
let opq: string = 'aaa';
add2<number, string>(xyz, opq); //声明“变量” 在赋值 a=xyz b=opq
// add2<number,string>(90:number,'aaa':string); //Error 传参的时候 值不需要指定数据类型
/// a=90:number  b='aaa':string
// add2<boolean,string>(90,'aaa'); //手动指定了泛型的数据类型 Error 90不是boolean

//我们现在写react vue 他们是支持ts的.
//框架函数很多支持泛型.


//接口 和 类 泛型
interface User2<T> {
    nickname: T
}
//没有自动推论 需要手动指定
let u: User2<number> = { nickname: 123 }
let u2: User2<string> = { nickname: "123" }

class People3<T>{
    run(a: T) {
        console.log("A===>", a);
    }
}

let p5 = new People3<string>();
// p5.run(9999);//Error 
p5.run('abc');


interface People123{
    //username:'zahgnsan' //错误
    username: string,
    abc:number,
    // sing:function(s:string):void; 错误
    rap: (s: string) => void;
    jump(s: string): void;
}
//基础 es6
let ccc={
    sing:function(){},
    rap:()=>{},
    jump(){}//es6写法
};








interface PB<T>{
    ab:T,
    play:()=>void;
} 
class PP implements PB<string>{
    ab="1234";
    play(){

    }
}